// pages/health/assistant/assistant.js

// DeepSeek API 类定义（内联版本）
class DeepSeekAPI {
  constructor() {
    this.baseURL = 'https://api.deepseek.com/v1';
    // 从本地存储获取API密钥，如果没有则使用默认值
    this.apiKey = wx.getStorageSync('deepseek_api_key') || 'sk-57c7ec98cad8498b90adcbea7e11d45e';
    this.model = 'deepseek-chat';
    this.maxTokens = 1000;
    this.temperature = 0.7;
  }

  // 设置API密钥
  setApiKey(apiKey) {
    this.apiKey = apiKey;
    wx.setStorageSync('deepseek_api_key', apiKey);
  }

  async chat(message, systemPrompt = '') {
    try {
      const messages = [];
      
      if (systemPrompt) {
        messages.push({
          role: 'system',
          content: systemPrompt
        });
      }

      messages.push({
        role: 'user',
        content: message
      });

      const response = await this.request('/chat/completions', {
        model: this.model,
        messages: messages,
        max_tokens: this.maxTokens,
        temperature: this.temperature
      });

      return response.choices[0].message.content;
    } catch (error) {
      console.error('DeepSeek API调用失败:', error);
      // 如果API调用失败，返回模拟回复
      return this.getMockResponse(message);
    }
  }

  async healthConsultation(question, userInfo = {}) {
    const systemPrompt = `你是一个专业的AI体重管理师和营养顾问，具备以下专业能力：
1. 健康饮食建议和营养搭配
2. 体重管理和减重指导
3. 运动建议和生活方式改善
4. 食物热量计算和营养成分分析
5. 慢性病饮食管理（如糖尿病、高血压等）

请用友好、专业、易懂的语气回答用户问题，并提供实用的建议。如果涉及医疗建议，请提醒用户咨询专业医生。

用户信息：${JSON.stringify(userInfo)}`;

    return await this.chat(question, systemPrompt);
  }

  async analyzeFood(foodDescription) {
    const systemPrompt = `你是一个专业的营养师，擅长食物营养成分分析和热量计算。
请根据用户提供的食物信息，分析其营养成分、热量含量，并提供健康建议。
如果信息不够详细，请询问更多细节。`;

    const question = `请分析以下食物：${foodDescription}`;
    return await this.chat(question, systemPrompt);
  }

  async request(endpoint, data) {
    return new Promise((resolve, reject) => {
      wx.request({
        url: this.baseURL + endpoint,
        method: 'POST',
        header: {
          'Content-Type': 'application/json',
          'Authorization': `Bearer ${this.apiKey}`
        },
        data: data,
        success: (res) => {
          if (res.statusCode === 200) {
            resolve(res.data);
          } else {
            reject(new Error(`API请求失败: ${res.statusCode} - ${res.data?.error?.message || '未知错误'}`));
          }
        },
        fail: (error) => {
          reject(error);
        }
      });
    });
  }

  async validateApiKey() {
    try {
      await this.chat('你好', '你是一个AI助手');
      return true;
    } catch (error) {
      console.error('API密钥验证失败:', error);
      return false;
    }
  }

  // 模拟AI回复（当API不可用时使用）
  getMockResponse(message) {
    const mockResponses = {
      '你好': '您好！我是您的AI体重管家，很高兴为您服务！',
      '减肥': '减肥需要科学的方法，建议您：1.控制饮食热量 2.增加运动量 3.保持规律作息。建议咨询专业营养师制定个性化方案。',
      '运动': '运动是健康生活的重要组成部分，建议每周至少150分钟中等强度运动，如快走、游泳、骑自行车等。',
      '饮食': '健康饮食要均衡营养，多吃蔬菜水果，适量蛋白质，控制油脂和糖分摄入。建议三餐定时定量。',
      '热量': '热量计算需要根据个人身高、体重、年龄、活动量等因素。一般成年女性每日需要1800-2000卡路里，男性需要2000-2500卡路里。'
    };

    // 根据关键词匹配回复
    for (const [keyword, response] of Object.entries(mockResponses)) {
      if (message.includes(keyword)) {
        return response;
      }
    }

    // 默认回复
    return '感谢您的咨询！我是AI体重管理师，可以为您提供健康饮食、运动建议等服务。由于API服务暂时不可用，建议您咨询专业医生获取更详细的建议。';
  }
}

// 创建API实例
const deepSeekAPI = new DeepSeekAPI();

Page({
  data: {
    text: '',
    messages: [],
    isLoading: false,
    isTyping: false
  },

  onLoad() {
    // 页面加载时初始化
    this.initAssistant();
  },

  // 初始化AI助手
  async initAssistant() {
    console.log('AI助手初始化完成');
    
    // 测试API连接
    try {
      const isValid = await deepSeekAPI.validateApiKey();
      if (isValid) {
        console.log('DeepSeek API连接成功');
        this.addMessage('ai', '您好！我是您的AI体重管家，现在可以为您提供专业的健康饮食建议了！有什么问题尽管问我吧～');
      } else {
        console.log('DeepSeek API连接失败，使用模拟模式');
        this.addMessage('ai', '您好！我是您的AI体重管家，目前使用模拟模式为您服务。您可以问我关于减肥、运动、饮食等问题！');
      }
    } catch (error) {
      console.error('API测试失败:', error);
      this.addMessage('ai', '您好！我是您的AI体重管家，目前使用模拟模式为您服务。您可以问我关于减肥、运动、饮食等问题！');
    }
  },

  // 输入框内容变化
  onInput(e) {
    this.setData({ text: e.detail.value });
  },

  // 发送消息
  async onSend() {
    const userMessage = this.data.text.trim();
    if (!userMessage) {
      wx.showToast({ title: '请输入消息', icon: 'none' });
      return;
    }

    // 添加用户消息到聊天记录
    this.addMessage('user', userMessage);
    
    // 清空输入框
    this.setData({ text: '' });
    
    // 显示加载状态
    this.setData({ isLoading: true, isTyping: true });

    try {
      // 调用DeepSeek API
      const aiResponse = await this.callDeepSeekAPI(userMessage);
      
      // 添加AI回复到聊天记录
      this.addMessage('ai', aiResponse);
      
    } catch (error) {
      console.error('AI回复失败:', error);
      this.addMessage('ai', '抱歉，我现在无法回复您的消息，请稍后再试。');
      wx.showToast({ title: 'AI回复失败', icon: 'none' });
    } finally {
      this.setData({ isLoading: false, isTyping: false });
    }
  },

  // 添加消息到聊天记录
  addMessage(type, content) {
    const messages = this.data.messages;
    const newMessage = {
      type: type,
      content: content,
      avatar: type === 'ai' ? '/static/upload/ai_avatar.jpg' : '/assets/images/ai_avatar.jpg',
      time: new Date().toLocaleTimeString()
    };
    
    messages.push(newMessage);
    
    console.log('添加消息:', newMessage);
    console.log('当前消息列表:', messages);
    
    this.setData({ messages });
    
    // 滚动到底部
    setTimeout(() => {
      this.scrollToBottom();
    }, 100);
  },

  // 滚动到底部
  scrollToBottom() {
    const query = wx.createSelectorQuery();
    query.select('.chat').boundingClientRect();
    query.exec((res) => {
      if (res[0]) {
        wx.pageScrollTo({
          scrollTop: res[0].height,
          duration: 300
        });
      }
    });
  },

  // 调用DeepSeek API
  async callDeepSeekAPI(message) {
    try {
      // 获取用户信息（如果有的话）
      const userInfo = this.getUserInfo();
      
      // 使用健康咨询API
      const response = await deepSeekAPI.healthConsultation(message, userInfo);
      return response;
    } catch (error) {
      console.error('DeepSeek API调用失败:', error);
      throw error;
    }
  },

  // 获取用户信息
  getUserInfo() {
    // 这里可以从本地存储或全局状态中获取用户信息
    const userInfo = wx.getStorageSync('userInfo') || {};
    return {
      name: userInfo.name || '用户',
      age: userInfo.age || null,
      gender: userInfo.gender || null,
      weight: userInfo.weight || null,
      height: userInfo.height || null,
      healthGoals: userInfo.healthGoals || []
    };
  },

  // 语音输入
  onVoice() {
    wx.showToast({ title: '语音功能开发中', icon: 'none' });
  },

  // 更多功能
  onPlus() {
    wx.showActionSheet({
      itemList: ['拍照记录', '选择图片', '记录体重', '查看历史', '配置API密钥'],
      success: (res) => {
        const actions = ['onPhoto', 'onSelectImage', 'onRecordWeight', 'onViewHistory', 'onConfigAPI'];
        if (actions[res.tapIndex]) {
          this[actions[res.tapIndex]]();
        }
      }
    });
  },

  // 配置API密钥
  onConfigAPI() {
    wx.showModal({
      title: '配置API密钥',
      content: '请输入您的DeepSeek API密钥',
      editable: true,
      placeholderText: 'sk-xxxxxxxxxxxxxxxx',
      success: (res) => {
        if (res.confirm && res.content) {
          const apiKey = res.content.trim();
          if (apiKey.startsWith('sk-')) {
            deepSeekAPI.setApiKey(apiKey);
            wx.showToast({ title: 'API密钥已更新', icon: 'success' });
            // 重新测试API
            setTimeout(() => {
              this.testAPI();
            }, 1000);
          } else {
            wx.showToast({ title: 'API密钥格式错误', icon: 'error' });
          }
        }
      }
    });
  },

  // 拍照记录
  onPhoto() {
    wx.chooseImage({
      count: 1,
      sizeType: ['compressed'],
      sourceType: ['camera'],
      success: (res) => {
        const tempFilePath = res.tempFilePaths[0];
        this.analyzeImage(tempFilePath);
      }
    });
  },

  // 选择图片
  onSelectImage() {
    wx.chooseImage({
      count: 1,
      sizeType: ['compressed'],
      sourceType: ['album'],
      success: (res) => {
        const tempFilePath = res.tempFilePaths[0];
        this.analyzeImage(tempFilePath);
      }
    });
  },

  // 分析图片
  async analyzeImage(imagePath) {
    wx.showLoading({ title: '分析中...' });
    
    try {
      // 这里可以集成OCR或图像识别API
      // 暂时使用模拟数据
      const foodDescription = '检测到食物图片，包含米饭、蔬菜和肉类';
      
      // 使用DeepSeek分析食物
      const analysis = await deepSeekAPI.analyzeFood(foodDescription);
      
      wx.hideLoading();
      this.addMessage('ai', analysis);
    } catch (error) {
      wx.hideLoading();
      this.addMessage('ai', '图片分析失败，请稍后再试。');
    }
  },

  // 记录体重
  onRecordWeight() {
    wx.navigateTo({
      url: '/pages/profile/weightMgr/weightMgr'
    });
  },

  // 查看历史
  onViewHistory() {
    wx.showToast({ title: '历史记录功能开发中', icon: 'none' });
  },

  // 清空聊天记录
  onClearChat() {
    wx.showModal({
      title: '确认清空',
      content: '确定要清空所有聊天记录吗？',
      success: (res) => {
        if (res.confirm) {
          this.setData({ messages: [] });
          // 重新初始化
          this.initAssistant();
        }
      }
    });
  },

  // 快速测试API
  async testAPI() {
    wx.showLoading({ title: '测试中...' });
    try {
      // 使用简单的测试消息
      const response = await deepSeekAPI.chat('你好', '你是一个AI助手');
      wx.hideLoading();
      this.addMessage('ai', response);
      wx.showToast({ title: 'API测试成功', icon: 'success' });
    } catch (error) {
      wx.hideLoading();
      console.error('API测试失败:', error);
      
      // 根据错误类型显示不同的提示
      if (error.message.includes('402')) {
        wx.showModal({
          title: 'API密钥问题',
          content: 'API密钥可能已过期或余额不足，请检查DeepSeek账户状态',
          showCancel: false
        });
      } else if (error.message.includes('401')) {
        wx.showModal({
          title: '认证失败',
          content: 'API密钥无效，请检查密钥是否正确',
          showCancel: false
        });
      } else {
        wx.showToast({ title: 'API测试失败', icon: 'error' });
      }
    }
  }
})